#ifndef SC_CONTROLLER_H
#define SC_CONTROLLER_H

#include "common.h"

#include <stdbool.h>

#include "control_msg.h"
#include "receiver.h"
#include "util/acksync.h"
#include "util/net.h"
#include "util/thread.h"
#include "util/vecdeque.h"

/* 自定义控制信息队列，默认长度64 */
struct sc_control_msg_queue SC_VECDEQUE(struct sc_control_msg);

/* 自定义控制器上下文，控制android设备的动作，
TODO 类似的定义是不是都是全局唯一的一个变量，其他地方都是地址引用 */
struct sc_controller {
    sc_socket control_socket;
    sc_thread thread;
    sc_mutex mutex;
    sc_cond msg_cond;

    /* 停止状态指示器 */
    bool stopped;

    /* 控制信息队列 */
    struct sc_control_msg_queue queue;
    struct sc_receiver receiver;

    const struct sc_controller_callbacks *cbs;
    void *cbs_userdata;
};

struct sc_controller_callbacks {
    void (*on_ended)(struct sc_controller *controller, bool error,
                     void *userdata);
};

/* 自定义控制器初始化 */
bool
sc_controller_init(struct sc_controller *controller, sc_socket control_socket,
                   const struct sc_controller_callbacks *cbs,
                   void *cbs_userdata);

void
sc_controller_configure(struct sc_controller *controller,
                        struct sc_acksync *acksync,
                        struct sc_uhid_devices *uhid_devices);

/* 自定义控制器销毁并清理 */
void
sc_controller_destroy(struct sc_controller *controller);

/* 
异步开启控制设备的服务 
@param controller
@return 开启成功返回true,否则返回false
*/
bool
sc_controller_start(struct sc_controller *controller);

void
sc_controller_stop(struct sc_controller *controller);

void
sc_controller_join(struct sc_controller *controller);

/*
发送控制信息到消息队列（将被异步取走发送给设备），如鼠标点击事件
@param controller 控制器上下文
@param msg 控制信息
@return 消息是否发送到队列中
*/
bool
sc_controller_push_msg(struct sc_controller *controller,
                       const struct sc_control_msg *msg);

#endif
